package fi.lappalainen.geoapp.utils;

import java.util.List;

/**
 * GeoCache-luokka kapseloi yksittäisen geokätkön tiedot ja toiminnallisuuden.
 * @author mika.j.lappalainen@gmail.com
 * @version 1.0
 * @since 1.0
 */
public class GeoCache {

    /**
     * Kätkön tyyppi. Kätkön tyyppit on lueteltu
     * @link http://www.geocaching.com/about/cache_types.aspx
     * @since 1.0
     */
    public enum CacheType {

        /**Peruskätkö*/
        Traditional,
        /**Multikätkö*/
        Multi,
        /**Project A.P.E*/
        ProjectAPE,
        /**Mysteerikätkö*/
        Mystery,
        /**Geolodju*/
        Letterbox,
        /**Wherigo-kätkö*/
        Wherigo,
        /**Tapahtuma*/
        Event,
        /**Suurtapahtuma */
        MegaEvent,
        /**Siivoustapahtuma */
        CITO,
        /**Geokohde*/
        Earth,
        /**Päämaja*/
        HQ,
        /**GPS Adventures*/
        GPSAdventures,
        /**Virtuaalikätkö*/
        Virtual,
        /**Webbikamerakätkö*/
        Webcam;

        /**
         * Palauttaa kätkön tyypin merkkijonona.
         * @return Kätkö tyyppi merkkijonona.
         */
        @Override
        public String toString() {
            String retval = null;
            switch (this) {
                case Webcam:
                    return "Webcam";
                case Virtual:
                    return "Virtual";
                case GPSAdventures:
                    return "GPSAdventures";
                case HQ:
                    return "HQ";
                case Earth:
                    return "Earth";
                case CITO:
                    return "CITO";
                case MegaEvent:
                    return "MegaEvent";
                case Event:
                    return "Event";
                case Traditional:
                    return "Traditional cache";
                case Multi:
                    return "Multi";
                case ProjectAPE:
                    return "ProjectAPE";
                case Mystery:
                    return "Unknown cache";
                case Letterbox:
                    return "Letterbox";
                case Wherigo:
                    return "Wherigo";

            }
            return retval;
        }
    };

    /**
     * Kätköpurkin koko. Kätköpurkkien koot lueteltu
     * @link http://www.geokätköt.fi/geokatkoily/piilottaminen/geokatkojen_koot.html
     * @since 1.0
     */
    public enum CacheSize {

        /**Mikro*/
        Micro,
        /**Pieni*/
        Small,
        /**Normaali*/
        Regular,
        /**Suuri*/
        Large,
        /**Muu*/
        Other,
        /**Ei ilmoitettu*/
        NotListed;

        /**
         * Palauttaa kätköpurkin koon merkkijonona.
         * @return kätkön koko.
         */
        @Override
        public String toString() {
            String retval = "Not Listed";
            switch (this) {
                case Micro:
                    return "Webcam";
                case Small:
                    return "Small";
                case Regular:
                    return "Regular";
                case Large:
                    return "Large";
                case Other:
                    return "Other";
            }
            return retval;
        }
    };

    /*
     * Geokätkön ID.
     */
    private String id;

    /*
     * Geokätkön nimi.
     */
    private String name;

    /*
     * Geokätkön vaikeusaste.
     */
    private double difficulty;

    /*
     * Maaston vaikeusaste.
     */
    private double terrain;

    /*
     * Lyhyt kuvaus
     */
    private String shortDescription;

    /*
     * Kuvaus.
     */
    private String longDescription;

    /*
     * Kätkön koordinaatit
     */
    private WayPoint point;

    /*
     * Muut kätköön mahdollisesti lisätyt reittipisteet. esim. p-paikka.
     */
    private List<WayPoint> wayPoints;

    /*
     * Kätkön koko
     */
    private CacheSize size;

    /*
     * Kätkön tyyppi.
     */
    private CacheType type;

    /*
     * Vinkki
     */
    private String hint;

    /**
     * Oletusmuodostin. Luo tyhjän geokätkö-olion.
     * @since 1.0
     */
    public GeoCache() {
    }

    /**
     * Lukumetodi kuvaukselle.
     * @return kuvaus.
     * @since 1.0
     */
    public String getLongDescription() {
        return longDescription;
    }

    /**
     * Lukumetodi vaikeusasteelle
     * @return vaikeusaste
     * @since 1.0
     */
    public double getDifficulty() {
        return difficulty;
    }

    /**
     * Lukumetodi kätkön ID:lle
     * @return id
     * @since 1.0
     */
    public String getId() {
        return id;
    }

    /**
     * Lukumetodi kätkön nimelle
     * @return nimi.
     * @since 1.0
     */
    public String getName() {
        return name;
    }

    /**
     * Lukumetodi lyhyelle kuvaukselle.
     * @return kuvaus
     * @since 1.0
     */
    public String getShortDescription() {
        return shortDescription;
    }

    /**
     * Lukumetodi kätkön maastoluokitukselle
     * @return maasto
     * @since 1.0
     */
    public double getTerrain() {
        return terrain;
    }

    /**
     * Lukumetodi kätkön koordinaateille
     * @return koordinaatit
     * @since 1.0
     */
    public WayPoint getPoint() {
        return point;
    }

    /**
     * Lukumetodi kätköön liitetyille reittipisteille
     * @return lista reittipisteistä
     * @since 1.0
     */
    public List<WayPoint> getWayPoints() {
        return wayPoints;
    }

    /**
     * Asetusmetodi kätkön kuvaukselle
     * @param longDescription Kätkön kuvaus.
     * @since 1.0
     */
    public void setDescription(String longDescription) {
        this.longDescription = longDescription;
    }

    /**
     * Asetusmetodi kätkön vaikeusasteelee
     * @param difficulty Kätkön vaikeusaste.
     * @since 1.0
     */
    public void setDifficulty(double difficulty) {
        this.difficulty = difficulty;
    }

    /**
     * Asetusmetodi kätkön ID:lle
     * @param id Kätkön ID.
     * @since 1.0
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * Asetusmetodi kätkön nimelle
     * @param name Kätkön nimi.
     * @since 1.0
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * Asetusmetodi kätkön lyhyelle kuvaukselle
     * @param shortDescription Lyhyt kuvaus kätköstä.
     * @since 1.0
     */
    public void setShortDescription(String shortDescription) {
        this.shortDescription = shortDescription;
    }

    /**
     * Asetusmetodi kätkön maastoluokitukselle
     * @param terrain maastoluokitus
     * @since 1.0
     */
    public void setTerrain(double terrain) {
        this.terrain = terrain;
    }

    /**
     * Asetusmetodi kätkön koordinaateille
     * @param point koordinaatit
     * @since 1.0
     */
    public void setPoint(WayPoint point) {
        this.point = point;
    }

    /**
     * Asetusmetodi kätköön liittyville reittipisteille
     * @param wayPoints lista reittipisteistä
     * @since 1.0
     */
    public void setWayPoints(List<WayPoint> wayPoints) {
        this.wayPoints = wayPoints;
    }

    /**
     * Hakumetodi kätkön koolle.
     * @return Kätkön koko.
     * @since 1.0
     */
    public CacheSize getSize() {
        return this.size;
    }

    /**
     * Asetusmetodi kätkön koolle.
     * @param newSize kätkön uusi koko.
     * @since 1.0
     */
    public void setSize(CacheSize newSize) {
        this.size = newSize;
    }

    /**
     * Asetusmetodi kätkön koolle.
     * @param newSize kätkön uusi koko.
     * @since 1.0
     */
    public void setSize(String newSize) {
        /*Mikro*/
        if (newSize.equalsIgnoreCase("Micro")) {
            this.size = CacheSize.Micro;
        }
        /*Pieni*/
        if (newSize.equalsIgnoreCase("Small")) {
            this.size = CacheSize.Small;
        }
        /*Normaali*/
        if (newSize.equalsIgnoreCase("Regular")) {
            this.size = CacheSize.Regular;
        }
        /*Suuri*/
        if (newSize.equalsIgnoreCase("Large")) {
            this.size = CacheSize.Large;
        }
        /*Muu*/
        if (newSize.equalsIgnoreCase("Other")) {
            this.size = CacheSize.Other;
        }
        /*Ei ilmoitettu*/
        if (newSize.equalsIgnoreCase("NotListed")) {
            this.size = CacheSize.NotListed;
        }
    }

    /**
     * Hakumetodi kätkön tyypille.
     * @return kätkön tyyppi.
     * @since 1.0
     */
    public CacheType getType() {
        return this.type;
    }

    /**
     * Asetusmetodi kätkön tyypille.
     * @param newType Kätkön uusi tyyppi
     * @since 1.0
     */
    public void setType(CacheType newType) {
        this.type = newType;
    }

    /**
     * Asetusmetodi kätkön tyypille.
     * @param newType Kätkön uusi tyyppi
     * @since 1.0
     */
    public void setType(String newType) {
        if (newType.equalsIgnoreCase("Webcam")) {
            this.type = CacheType.Webcam;
        }
        if (newType.equalsIgnoreCase("Virtual")) {
            this.type = CacheType.Virtual;
        }
        if (newType.equalsIgnoreCase("GPSAdventures")) {
            this.type = CacheType.GPSAdventures;
        }
        if (newType.equalsIgnoreCase("HQ")) {
            this.type = CacheType.HQ;
        }
        if (newType.equalsIgnoreCase("Earth")) {
            this.type = CacheType.Earth;
        }
        if (newType.equalsIgnoreCase("CITO")) {
            this.type = CacheType.CITO;
        }
        if (newType.equalsIgnoreCase("MegaEvent")) {
            this.type = CacheType.MegaEvent;
        }
        if (newType.equalsIgnoreCase("Event")) {
            this.type = CacheType.Event;
        }
        if (newType.equalsIgnoreCase("Traditional Cache")) {
            this.type = CacheType.Traditional;
        }
        if (newType.equalsIgnoreCase("Multi")) {
            this.type = CacheType.Multi;
        }
        if (newType.equalsIgnoreCase("ProjectAPE")) {
            this.type = CacheType.ProjectAPE;
        }
        if (newType.equalsIgnoreCase("Mystery")) {
            this.type = CacheType.Mystery;
        }
        if (newType.equalsIgnoreCase("Unknown Cache")) {
            this.type = CacheType.Mystery;
        }
        if (newType.equalsIgnoreCase("Letterbox")) {
            this.type = CacheType.Letterbox;
        }
        if (newType.equalsIgnoreCase("Wherigo")) {
            this.type = CacheType.Wherigo;
        }
    }

    /**
     * Hakumetodi kätkön vinkille.
     * @return hint
     */
    public String getHint() {
        return hint;
    }

    /**
     * Asetusmetodi kätkön vinkille.
     * @param hint Uusi vinkki.
     */
    public void setHint(final String hint) {
        this.hint = hint;
    }
}
